package com.kyl.service.impl;


import cn.hutool.core.bean.BeanUtil;
import com.aliyun.iot20180120.Client;
import com.aliyun.iot20180120.models.QueryDeviceRequest;
import com.aliyun.iot20180120.models.QueryDeviceResponse;
import com.aliyun.iot20180120.models.QueryDeviceResponseBody;
import com.aliyun.iot20180120.models.QueryProductListResponse;
import com.github.pagehelper.Page;
import com.kyl.base.PageResponse;
import com.kyl.mapper.DeviceMapper;
import com.kyl.service.DeviceService;
import com.kyl.utils.ObjectUtil;
import com.kyl.vo.DeviceVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author WanJl
 * @version 1.0
 * @title DeviceServiceImpl
 * @description
 * @create 2025/1/17
 */
@Slf4j
@Service
public class DeviceServiceImpl implements DeviceService {

    //使用阿里云IOT提供的客户端对象
    @Autowired
    private Client client;

    //使用连接阿里云IOT所需要的各种参数
    @Value("${kyl.aliyun.iotInstanceId}")
    private String iotInstanceId;

    @Resource
    private DeviceMapper deviceMapper;

    @Override
    public PageResponse<DeviceVo> queryDeviceList(QueryDeviceRequest request) throws Exception {
        //把我们要查询的公共实例ID作为参数传入
        //补全查询设备所需要的最后一个参数-公共实例Id
        request.setIotInstanceId(iotInstanceId);
        //通过该实例ID查询该实例下的设备
        QueryDeviceResponse queryDeviceResponse = client.queryDevice(request);
        QueryDeviceResponseBody body = queryDeviceResponse.getBody();
        //--------以上---连接阿里云IOT服务器，根据条件查询设备信息---------

        //-------以下---根据设备信息进行处理---------
        //有没有设备不知道，所以需要判断
        if (body.getData() != null && body.getSuccess().equals(true)) {
            //获取设备信息集合
            List<QueryDeviceResponseBody.QueryDeviceResponseBodyDataDeviceInfo> deviceInfo = body.getData().getDeviceInfo();
            //获取设备信息
            if (ObjectUtil.isEmpty(deviceInfo)) return null;
            //把获取到的设备信息集合的每一个设备信息中的设备ID，放入一个集合中
            List<String> list = deviceInfo.stream().map(QueryDeviceResponseBody.QueryDeviceResponseBodyDataDeviceInfo::getIotId).collect(Collectors.toList());

            //拿到 这些Id集合后，需要以此为条件查询我们自己的数据库
            //目的是查询出我们自己的数据库中，这些设备ID对应的设备信息，比如绑定的对象是老人还是位置，绑定的对象的ID是多少，绑定的位置是哪个位置
            List<DeviceVo> deviceVos = deviceMapper.selectByDeviceIds(list);
            //把查询到的设备集合转换为Map集合，方便后续操作
            Map<String, DeviceVo> deviceVoMap = deviceVos.stream().collect(Collectors.toMap(DeviceVo::getDeviceId, v -> v));


            //我们把从IOT平台查询到的设备集合，和从数据库查到的匹配成功的设备集合进行追加
            List<DeviceVo> vos = deviceInfo.stream().map(d -> {
                //把每一个设备的信息转为deviceVo对象
                DeviceVo deviceVo = BeanUtil.toBean(d, DeviceVo.class);
                deviceVo.setDeviceId(d.getIotId());
                //如果设备Map不为空，并且包含当前的设备ID，那么就获取到这个设备对应的信息，并追加到deviceVo对象中
                if (ObjectUtil.isNotEmpty(deviceVoMap) && ObjectUtil.isNotEmpty(deviceVoMap.get(d.getIotId()))) {
                    //d.getIotId()是从IOT平台查到的设备ID，deviceVoMap.get(d.getIotId())是从数据库查到的设备ID对应的设备信息
                    DeviceVo device = deviceVoMap.get(d.getIotId());
                    BeanUtil.copyProperties(device, deviceVo);
                }
                return deviceVo;
            }).collect(Collectors.toList());

            return PageResponse.of(vos, body.getPage(), body.getPageSize(), (long) body.getPageCount(), (long) body.getTotal());

        }


        return null;
    }
}
